Matlab绘制不等间距数据的等距colorbar的方法及带尖角colorbar方法

您所在的位置:网站首页 matlab 等距线 Matlab绘制不等间距数据的等距colorbar的方法及带尖角colorbar方法

Matlab绘制不等间距数据的等距colorbar的方法及带尖角colorbar方法

#Matlab绘制不等间距数据的等距colorbar的方法及带尖角colorbar方法| 来源: 网络整理| 查看: 265

简介

在制作colorbar的时候,对于超过一定范围的数据,需要用同一个颜色进行表示,此时颜色条应该带有尖角。有时候碰到需要设置不均匀间隔的colorbar又的进行设置。目前Matlab自带colorbar不能很好完成上述需求,下面对从网络上找到的集中方法进行一个汇总。不同方法具有不同的应用场景。

方法1——不等距离且带箭头

基于M_map工具实现。该工具的具体安装使用可以参考前面博文中内容。 核心代码:

[CS,CH]=m_contourf(LN,LT,prate'*1e3,[0.05:.05:.7],'edgecolor','none'); ax=m_contfbar([.3 .7],.05,CS,CH);

代码解释: ax=m_contfbar([.3 .7],.05,levels,levels);水平bar ax=m_contfbar(0.9, [.1 .9],levels,levels);垂直bar

效果: 在这里插入图片描述 优点:带箭头,支持不等间距。 缺点:不等间距时colorbar上颜色也不等间距,并且对于无限小区间的数据用白色表示。该缺点对于很多数据不可接受。 提示:如果需要不等间距,而颜色等间距,则需要调整数据。 在这里插入图片描述

方法2——不等间距colorbar实现

来自气象家园,运行需要M_map。 优点:支持不等间距。 缺点:不带箭头。

clear all;close all;clc load('data.mat') load('map.mat'); space_shp=0.05; xi=round(min(x_gz))-1:space_shp:round(max(x_gz))+1; yi=round(min(y_gz))-1:space_shp:round(max(y_gz))+1; [XI,YI]=meshgrid(xi,yi); ZI1=interp2(lon,lat,data,XI,YI,'nearest'); % 'linear'、'nearest'、'natural'、'cubic' 或 'v4'。默认方法为 'linear' isin=inpolygon(XI,YI,x_gz,y_gz); ZI1(~isin)=NaN; %% 降水量不等间距填色图 % %降水量颜色设置 cmap=[255 255 255; 150 255 150; 50 146 60; 100 184 244;... 0 0 241; 255 0 255; 192 0 100;192 100 100;]/255; level = [0,0.1,10,25,50,100,200,250] ; [~,ZI2]=histc(ZI1,level); ZI2=ZI2-1; %% 绘图 figure('position',[50 50 800 600]); m_proj('mercator','lon',[103,110],'lat',[24,30]); [cs,h2]=m_contourf(XI,YI,ZI2,'LineWidth',0.5); hold on % -------------------------- set(h2,'LineStyle','none'); shading flat; %填充平滑 colormap(cmap) ; caxis([0 length(level)]) ; cbar = colorbar; set(cbar,'Ticks',0:length(level)-1,'TickLabels',level) ; set(cbar,'TickLength',0); m_plot(x_gz2,y_gz2,'LineWidth',0.5,'Color','k'); set(gca,'FontSize',8); m_grid('linest','none','tickdir','in'); xlabel('经度'); ylabel('纬度'); title1=strcat('24h降水量'); title(title1,'FontSize',8); print('-dpng',strcat(title1,'.png')); hold off

在这里插入图片描述

方法3——带箭头等间距

出自Matlab论坛,转自气象家园。 优点:带箭头。 缺点:不支持不等间距,且颜色无限小时候为白色,经实测生成的图看着不漂亮。

在这里插入图片描述

方法4——不等间距不带箭头

来自气象家园,该方法与另一个帖子效果一致。 优点:效果不错。 缺点:通过区间划分的方式进行绘制,不带箭头。

在这里插入图片描述

方法5——不能间距且带箭头

来自气象家园。 优点:支持不等间距,且带箭头,效果堪称完美。 注意:绘图时候需要自定义位置。结合M_map工具绘制非等间距效果完美。 调用例子1:

tick=-20:5:20; color=[69 117 180;116 173 203;171 217 233;254 224 144;253 174 77;244 109 67;215 48 39;165 0 38]/255; mode='h'; colorbarn(tick,color,mode)

在这里插入图片描述

调用例子2:

color=[131 0 162;160 0 198;109 0 219;31 60 249;0 160 230;0 198 198;0 209 139;0 219 0;160 230 51;230 219 51;230 175 45;239 130 41;239 0 0;219 0 98;255 1 118]/255; tick=515:5:590; mode='v'; %---------------------------------------------------------- %lon lat data_9是绘图数据 [ax1,c,h]=contf_line(lon,lat,data_9,tick,color,mode); set(gca,'fontname','Times New Roman','fontsize',16,'fontangle','italic'); set(c,'fontname','Times New Roman','fontsize',14)

在这里插入图片描述 函数代码:

function [ax1,c] = colorbarn(tick,color,mode) %--------------------------------- %带尖端的colorbar %[ax1,c] = COLORBARN(tick,color,mode) %坐标轴句柄是c,绘图窗句柄是ax1 %详情请参考函数 [ax1,c,h]=contf_line(lon,lat,X,tick,color,mode) %--------------------------------- [m,~]=size(color); len_tick=length(tick); if len_tick-m ~= 1 return end figure; set(gcf,'color','w'); if isequal(mode,'h') c=axes('position',[0.1 0.1 0.8 0.03]); cdata=zeros(1,m); for i=1:m cdata(i)=(tick(i)+tick(i+1))/2; end axis([0 m 0 1]) line([0 1],[0 0],'linewidth',2,'color','w','parent',c) line([m-1 m],[0 0],'linewidth',2,'color','w','parent',c) colormap(color); %------------------------ pat_v1=[1 0;1 1;2 1;2 0];pat_f1=reshape(1:(m-2)*4,4,m-2)'; for j=2:m-2 pat_v1=[pat_v1;[j 0;j 1;j+1 1;j+1 0]]; end pat_col1=[cdata(2:end-1)]'; patch('Faces',pat_f1,'Vertices',pat_v1,'FaceVertexCData',pat_col1,'FaceColor','flat'); %-------------------------------------------------- pat_v2=[0 0.5;1 0;1 1;m-1 1;m-1 0;m 0.5]; pat_f2=[1 2 3;4 5 6]; pat_col2=[cdata(1);cdata(end)]; patch('Faces',pat_f2,'Vertices',pat_v2,'FaceVertexCData',pat_col2,'FaceColor','flat'); %--------------------------------------------------------- set(c,'color','none','xcolor','k','ycolor','none'); box off % line([1 m-1],[0 0],'color','k') % line([1 m-1],[1 1],'color','k') % for i=2:m-2 % line([i i],[0 1],'color','k') % end set(c,'xtick',1:m-1,'xticklabel',num2cell(tick(2:end-1)),'ytick',[]) ax1=axes('position',[0.1 0.2 0.8 0.7]); elseif isequal(mode,'v') c=axes('position',[0.87 0.11 0.02 0.81]); set(c,'yaxislocation','right'); cdata=zeros(1,m); for i=1:m cdata(i)=(tick(i)+tick(i+1))/2; end axis([0 1 0 m]) line([1 1],[0 1],'linewidth',2,'color','w','parent',c) line([1 1],[m-1 m],'linewidth',2,'color','w','parent',c) colormap(color); %-------------------------------------------- pat_v1=[0 1;1 1;1 2;0 2];pat_f1=reshape(1:(m-2)*4,4,m-2)'; for j=2:m-2 pat_v1=[pat_v1;[0 j;1 j;1 j+1;0 j+1]]; end pat_col1=[cdata(2:end-1)]'; patch('Faces',pat_f1,'Vertices',pat_v1,'FaceVertexCData',pat_col1,'FaceColor','flat'); %-------------------------------------------------- pat_v2=[0.5 0;1 1;0 1;1 m-1;0.5 m;0 m-1]; pat_f2=[1 2 3;4 5 6]; pat_col2=[cdata(1);cdata(end)]; patch('Faces',pat_f2,'Vertices',pat_v2,'FaceVertexCData',pat_col2,'FaceColor','flat'); %------------------------------------------------------ set(c,'color','none','xcolor','none','ycolor','k'); box off set(c,'ytick',1:m-1,'yticklabel',num2cell(tick(2:end-1)),'xtick',[]) ax1=axes('position',[0.11 0.11 0.74 0.81]); else disp('colorbarn格式出错') return end end function [ax1,c,h]=contf_line(lon,lat,X,tick,color,mode) % --------------------------------- %contourf()绘图,带尖端的colorbar %[ax1,c,h]=CONTF_LINE(lon,lat,X,tick,color,mode) % %tick的个数比color的行数多一个 %ax1控制绘图窗,c控制colorbar,h控制contourf函数 %-------- %修改colorbar间隔: %lab=get(c,'x/yticklabel'); %lab(2:2:end)={' '}; %set(c,'x/yticklabel',lab); %-------- %copyright 傅辉煌 % ---------------------------------------- [m,~]=size(color); len_tick=length(tick); if len_tick-m ~= 1 return end [ax1,c]=colorbarn(tick,color,mode); [~,h]=contourf(lon,lat,X); set(h,'levellist',tick,'linecolor','none'); colormap(color); caxis([tick(1) tick(end)]) end 总结

推荐使用最后一种方法,效果最好。 最后一种方法提供了两端尖头的colorbar,如果需要单头或者无尖头的colorbar对最后一种方法相应代码重写即可。双尖端colorbar、上部单尖端、下单尖端和无尖端colorbar。这里是某全球数据,数据范围[0,103],图中对几种尖端不等间距colorbar进行了绘制。 在这里插入图片描述

可以对颜色条进一步修改增加颜色渐变范围 在这里插入图片描述

参考

http://bbs.06climate.com/forum.php?mod=viewthread&tid=51247&extra=page%3D4 http://bbs.06climate.com/forum.php?mod=viewthread&tid=49521&typeid=12 https://blog.csdn.net/weixin_42614163/article/details/99677492 http://bbs.06climate.com/forum.php?mod=viewthread&tid=46894&highlight=colorbar



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3